/*
 * Public Credit Information Sharing Platform(PCISP).
 * Copyright (c) 2019-2020 jsxzkingdee and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 * Please visit https://www.zhengxinsoft.com if you need additional information or have any questions.
 */

package com.platform.comm.util.crypto.sm4;


import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

/**
 * Description: SM4加密工具
 *
 * @author libin created on 2020/7/28.
 */
public class SM4Utils {

    private static final String ENCODING = "UTF-8";

    /**
     * 加密
     *
     * @param input 需要加密的字符串
     * @param key   加密的密钥
     * @return 加密后的字符串。这个字符串是base64格式的
     * @throws IOException 异常
     */
    public static String encodeByBase64(String input, String key) throws IOException {
        return encodeByBase64(input, key.getBytes(ENCODING));
    }

    /**
     * 加密
     *
     * @param input 需要加密的字符串
     * @param key   秘钥
     * @return 这个字符串是base64格式的
     * @throws UnsupportedEncodingException 异常
     */
    public static String encodeByBase64(String input, byte[] key) throws UnsupportedEncodingException {
        return Base64.encodeBase64String(encode(input.getBytes(ENCODING), key));
    }

    /**
     * 解密
     *
     * @param input 加密的字符串。这个字符串是base64格式的
     * @param key   密钥
     * @return 解密后的字符串
     * @throws IOException 异常
     */
    public static String decodeByBase64(String input, String key) throws IOException {
        return decodeByBase64(input, key.getBytes(ENCODING));
    }

    /**
     * 解密
     *
     * @param input 加密的字符串。这个字符串是base64格式的
     * @param key   密钥
     * @return 解密后的字符串
     * @throws IOException 异常
     */
    public static String decodeByBase64(String input, byte[] key) throws IOException {
        return new String(decode(Base64.decodeBase64(input), key), ENCODING).trim();
    }

    /**
     * 加密
     *
     * @param input 需要加密的字符串
     * @param key   加密的密钥
     * @return 加密后的字符串。这个字符串是16进制格式的
     * @throws IOException 异常
     */
    public static String encodeByHexStr(String input, String key) throws IOException {
        return encodeByHexStr(input, key.getBytes(ENCODING));
    }

    /**
     * 加密
     *
     * @param input 需要加密的字符串
     * @param key   秘钥
     * @return 这个字符串是16进制格式的
     * @throws UnsupportedEncodingException 异常
     */
    public static String encodeByHexStr(String input, byte[] key) throws UnsupportedEncodingException {

        return Hex.encodeHexString(encode(input.getBytes(ENCODING), key));
    }

    /**
     * 解密
     *
     * @param input 加密的字符串。这个字符串是16进制格式的
     * @param key   密钥
     * @return 解密后的字符串
     * @throws IOException 异常
     */
    public static String decodeByHexStr(String input, String key) throws Exception {
        return decodeByHexStr(input, key.getBytes(ENCODING));
    }

    /**
     * 解密
     *
     * @param input 加密的字符串。这个字符串是16进制格式的
     * @param key   密钥
     * @return 转换后字符串
     * @throws Exception 异常
     */
    public static String decodeByHexStr(String input, byte[] key) throws Exception {
        return new String(decode(Hex.decodeHex(input), key), ENCODING).trim();
    }

    /**
     * 加密
     *
     * @param input 需要加密的数据
     * @param key   秘钥
     * @return 加密后的数据
     */
    public static byte[] encode(byte[] input, byte[] key) {
        return new SM4().encode(input, key);
    }

    /**
     * 解密
     *
     * @param input 加密的数据
     * @param key   秘钥
     * @return 解析后的数据
     */
    public static byte[] decode(byte[] input, byte[] key) {
        return new SM4().decode(input, key);
    }
}
